package com.sulent.frame.web.scheduler;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @ClassName TestScheduler
 * @Description: TODO
 * @Author Submerge.
 * @Since 2024/12/4 15:57
 * @Version 1.0
 */
@Component
public class TestScheduler {


    /**
     * 测试分布式调度，每十秒执行一次。
     * 有两个task1/2，每十秒执行一次，分布式锁时长为20s
     *1、锁过期后才可以继续执行调度，会不会造成方法堆积
     *2、相同过期时间，每次只能有一个执行？
     * 理想情况：相同锁的方法，只有优先抢到执行权的执行，没抢到下次参与再抢
     *
     * 案例：方法每20秒执行一次，共有2个实例，每个实例执行时间为10s,锁过期时间为3s
     * 1、执行时间相同，每次仅一个实例被执行。
     * 2、
     */
    //@Scheduled(initialDelay = 10*1000, fixedDelay = 20*1000)
    @Scheduled(cron = "0 * * * * ?")
    @SchedulerLock(name = "TestScheduler_task1", lockAtLeastFor = "PT30S")
    public void task1() throws InterruptedException {
        System.out.println("task1抢到执行权："+ LocalDateTime.now());
        //Thread.sleep(1500);
    }


    //@Scheduled(initialDelay = 10*1000, fixedDelay = 20*1000)
    @Scheduled(cron = "0 * * * * ?")
    @SchedulerLock(name = "TestScheduler_task1", lockAtLeastFor = "PT30S")
    public void task2() throws InterruptedException {
        System.out.println("task2抢到执行权："+ LocalDateTime.now());
        //System.out.println(1/0);
        //Thread.sleep(1000);
    }
}
